package com.twq.basic.bigpicture

/**
 * Created by tangweiqun on 2017/11/27.
 * 使的程序更函数式
 */
object Step11 {
  def main(args: Array[String]): Unit = {
    //命令式编程与函数式编程
    //第一步：如果你的代码里包含了很多的var，那么代码的风格是命令式编程
    //但是如果代码中没有var，而只是val的时候，那么代码的风格就是函数式编程

    //1、scala中包含了var和val，这两个都是工具，能很好的解决你的需求就行，但是scala还是偏向于推荐使用val
    //这个是因为函数式编程可以使你写出更易懂且不容易出错的代码
    def printArgsImperative(args: Array[String]): Unit = {
      var i = 0
      while (i < args.length) {
        println(args(i))
        i += 1
      }
    }

    //2、消除掉var，但是带有side affect
    def printArgsFunction(args: Array[String]): Unit = {
      for (arg <- args)
        println(arg)
    }

    def printArgsFunctionAll(args: Array[String]): Unit = {
      args.foreach(println)
    }
    //3、消除var和side effect
    println(formatArgs(args))
    //使得更容易测试代码
    val res = formatArgs(Array("zero", "one", "two"))
    assert(res == "zero\none\ntwo")

    //使用val、不可变对象以及使用没有side affect的方法是scala推荐的编程风格
    //但是如果特殊的场景需要用var、可变对象以及使用有side affect的方法的时候，我们可以用命令式编程风格
  }

  def formatArgs(args: Array[String]) = args.mkString("\n")
}
